Using the Map View
Map View (or Map) is a real-time graphical display of the ActiveBatch workflows and their objects with a specific emphasis placed on Plans and/or Jobs.
Map is used by job authors to create Jobs and Plans and establish relationships between those objects. ActiveBatch operators can also use Map to monitor actively running Jobs and Plans since the view offers real time status updates.
The Map View can be accessed at the Job Scheduler (root) level to see the entire system; or, at the Plan or Folder level to see objects recursively from that level.
Map View allows you to create and manipulate various ActiveBatch objects. It is the predominant view for graphically creating workflows. Jobs and Plans can be linked together using constraints, completion triggers, and Alert triggers. In Map View, your Jobs and their relationships to other Jobs in the system can be visually seen and graphically managed.
What you see in the Map View canvas area are Folders, Plans and Jobs (and Job/Plan References). You can expand a Folder or Plan to see the contents within them, which is limited to nested Folders, Jobs or nested Plans. The canvas area does not display shared objects (e.g. Queues, User Accounts, Schedules, etc.). That information can be seen using the Child Objects or Associated Objects panes, depicted on the right in the image below.
When the Map View is first launched, you will see the larger portion of the canvas containing whatever workflows and objects can fit in the window and a smaller “context” window in the upper right-hand corner (Map Overview) that displays the entire level. This smaller window allows you to pan and bring other objects into view. Map supports both pan and zoom. All shapes and text will scale as you zoom in and out. Three (3) dockable panes appear on the right: Child Objects, Associated Objects and Pinned Objects.
Note: If you do not see any or all of the above described smaller windows (Child, Associated and Pinned objects), click on the far-right gear icon in the toolbar, then select View. From there, select the desired window(s).
Child Objects refers to those objects at this level that are not Jobs, Folders or Plans. In other words, all of the rest of the ActiveBatch (shared) objects that reside at the level you are viewing. Child objects appear in this pane by selecting the container you would like to see this information for.
Associated Objects contains the list of objects that are associated with a selected objects. For example, a Queue and User Account object would minimally appear here for a Job. To see associated objects, you must click the "Get Associated Objects" icon (a "chain link" icon) on the container you are viewing.
Pinned Objects depicts objects in both the Child Objects and Associated Objects panes that a user has pinned. You can pin an object that you will be using regularly. Think of pinned objects as a type of favorites for the Map View. If you pin a Plan or Folder you can also easily access the underlying nested objects in the container.
To learn more about specific features of the Map View, expand the desired option below.

The top row contains a tool bar with various buttons that control various Map View actions.
The tool bar is arranged in logical groups. From left to right:
-
Updating
-
Refresh. This button will cause a complete refresh of the Map View.
-
Auto-Refresh. This button, when depressed, will enable WMI updates. If the button is in the Up position, you can stop auto-refresh updates from changing the view. This can be very useful when you’re designing a workflow that may also be executing.
-
-
View History Traversal
-
Left and Right arrows. These buttons allow you to traverse previous and next views from your recent history of using Map. This is useful when you need to go to a different level or Map area and then return back to what you were looking at.
-
-
Zoom
-
Zoom In. Zoom to Fit. Zoom Out.
-
Reset Layout. This button is useful when you have made some changes to the view and want to have the smart layout reset your view.
-
-
Get Associated Objects. Clicking this button will retrieve all objects that are associated with objects at the level selected and populate the “Associated Objects” pane.
-
Pan/Misc
-
Pan Mode. Select Mode. Zoom Mode.
-
-
Search
-
Collapse All
-
Gear - General settings and open/close Map Overview, Child Objects, Associated Objects and Pinned Objects.

This section discusses what you can expect to see when hovering over an object or instance in Map View.
The example image above is a Job object. The object consists of the following from left to right, top-to-bottom. First, the green box is called the accent stripe. It indicates the status of the last completed execution using standard ActiveBatch colors. A larger accent stripe indicates that the Job is actively executing. Next, the icon to the right of the accent stripe depicts the Job type (Process, Script or Jobs Library). In this example, it is the Script icon. At the bottom of the image is the name of the object.
Job and Plan definitions provide a simple tooltip that indicates the ID and path of the object.
The example above shows “JobE” and the tooltip for that object.
Hovering over the green accent stripe (to the left of the Job type icon) provides tooltip information about the last completed instance, as depicted above. The icon is color coded and follows the standard use of ActiveBatch colors to denote how the last instance completed (i.e. green=success, red=failure, purple=aborted).
The tool tip above describes a constraint that has been configured in the workflow. You will see this when you mouse over the dashed line which symbolizes a constraint. If you mouse over a completion trigger (a solid line), you will also see a tooltip.

This section lists hotkeys supported by the Map View.
Key Descripton | GUI (AbatConsole) |
---|---|
Delete Object |
DELETE |
Cut |
CTRL + X |
Copy |
CTRL + C |
Paste |
CTRL + V |
Rename object Name & Label |
F2 |
Expand Container |
+ |
Collapse Container |
- |
Collapse All Containers |
SHIFT + ‘-‘ |
Script Editor/Job Step Editor |
Double Click on Icon |
Property Sheet |
ALT + ENTER |
Search Bar |
CTRL + SPACE |
Fit to zoom |
ALT + F |
Drag Zoom |
ALT + Z |
Panning |
ALT + C |
Select Mode |
ALT + X |
Pin |
CTRL + SHIFT + P |
Un-Pin |
CTRL + SHIFT + U |

The Map View area is separated into two (2) sections: Overview and Canvas. The Overview or smaller box shows your entry level and all subsequent levels downward. We say “entry level” because that term describes the level you entered the Map View. If you click “Map” at root level, then the entire ActiveBatch system is available (assuming root level is the Job Scheduler and not a
connection). If you click “Map” as a result of right-clicking from a Folder or Plan, then your entry level will begin with the Folder or Plan.Overview Box
The Overview box is useful for panning to an area of ActiveBatch that isn’t visible in the larger canvas. You can turn the Overview box on or off, via the Settings “gear” on the Map toolbar, then selecting View > Map Overview. You can also remove the Overview by clicking on the “x” in the upper right hand corner. You can also grab the box by the title and move it to a more appropriate place if the box itself is overlaying something you need to see. The Overview Box is a dockable pane so it can be moved and docked to a more suitable spot if needed.
The above figure is a Map View display of a Scheduler at root level. The red lines in the Overview Box indicate what is visible in the canvas area; what is visible is the information between the red lines. You would need to vertically scroll or pan within the Overview area to see what isn’t currently visible.
Note: At the entry level only, if all the Plan or Job objects are standalone and contain no relationships (i.e. completion triggers or Job constraints). Map View will stack all the Job and Plan objects for easier initial display.
Canvas
The Canvas contains the area for object display. Map View only displays Plans, Folders and Jobs in the Canvas. Other objects are displayed in list fashion within the other dockable panes named Child Objects and Associated Objects.
A Job consists of an icon which reflects the type of Job it is (i.e. Process, Script or Jobs Library) with the name of the Job underneath the icon. A Plan or Folder has a box lightly drawn around it. At the top-left of the box is the expand/collapse icon, followed by the Folder or Plan icon and the object name. In the image below, the Folder object is not expanded, but the Plan object is. In the Plan is a Job named Powershell.
If you select an object (Folder, Plan, or Job), a blue bold box is drawn to visually indicate the object that is selected. You can multi-select objects through the standard Windows hot key of Ctrl.
In the above image, the UsersGuideCaseStudies Folder has been selected and expanded. Observe the Plan and Folders have some tool icons associated with them (located to the right of the Folder or Plan name). When looking at the CaseStudy1 Plan, you see, from left to right the following icons: Optimize, Reset Layout and Get Associated Objects. Reset Layout and Get Associated Objects are options applicable to Folders as well. We will explain these toolbar icons in the following sections.

In addition to the Canvas area, three (3) separate dockable panes are provided to allow for simple and easy association of objects. While the sub-sections that follow describe each pane in greater detail, the common purpose all three panes share is the ability to drag and drop. If you drag and drop an object from the Child Objects or Associated Objects pane to the Pinned Objects pane, the object is pinned. Pinning an object allows for fast and easy reference to the object for association or other purposes.
Note: If you do not see any or all of the above described panes (Child, Associated or Pinned), click on the far-right gear icon in the toolbar, then select View. From there, select the desired option.
Child Objects Pane
The Child Objects Pane is a dockable pane that displays all of the shared objects (if any) in the currently selected Folder or Plan.
In the above figure, the Folder “Objects” is selected. One of the ActiveBatch recommendations is to store your non-Job/Plan/Folder objects (i.e. shared objects) in a separate Folder named “Objects” (or something similar) for ease in locating those types of objects. When Objects is selected, the Child Objects pane is populated. Child Objects will be populated whenever a container object is selected. You could then drag-and-drop any of the listed objects to any object that is visible in Map View (assuming your object security permissions allow for this). Note: If there are no shareable objects in the selected Folder or Plan, the Child Objects pane will be empty.
Associated Objects Pane
The Associated Objects pane is a dockable pane that, upon request, displays all objects that are associated with the current level selected and its child objects, one level deep. For example, if you click on a Plan in the canvas area, then click on the Plan's get associated objects icon (the chain) - the associated objects pane will include objects associated to the Plan (if any), and objects associated to its immediate child Jobs. If there are nested Plans, their child object associations won't be displayed unless you select the nested Plan and get its associated objects.
In the image below, the FTP BankA Plan was selected in the Map View canvas area. You can tell as a blue box has been drawn around it. The chain icon to the far right of the Plan's name is the icon (chain image) used to get associated objects. When doing so, the associated objects pane includes FTP BankA's "Plan Alert" (Alert object) association and its Schedule object association (SchedA). It also displays the child Jobs and the objects the Jobs are associated with.
Next, in the image above, to the right of SchedA and Plan Alert, are yellow icons that when you mouse over them, reveals a tooltip stating "Disassociate". This feature allows you to disassociate non essential shared objects from the object using it. An Alert object is not required to be associated to a Plan, therefore you are allowed to disassociate it by clicking on the yellow icon. The same applies to the Schedule object. You will be prompted to confirm the disassociation. The system will only allow disassociation for non-essential shared objects (the yellow icon will not appear next to an object if it cannot be disassociated). For example, you cannot disassociate a Queue object from a Job since the Queue is a required object that must be associated to every Job. The same applies to a Job's Execution > User Account object.
Map View provides two (2) methods for requesting a list of associated objects.
The first method is the Plan/Folder get associations "chain" icon discussed above. The same icon is present in the Map View's toolbar, and if you click it there, the Map view will display associated objects at the entry level at which you entered the Map view. For example, if you right click on a Plan in the Navigation pane, then select View > Map, then click on the Map View's get associations chain icon, you will see objects associated to the Plan and its immediate child objects.
Pinned Objects Pane
The Pinned Objects Pane is a dockable pane that displays all pinned objects. Pinned objects are those you would typically want to associate to Jobs and/or Plans or otherwise quickly access. So think of Pinned Objects as a type of “favorites” for the Map View.
You have several methods for pinning an object to this pane.
-
You can drag the object from either the Child Objects or Associated Objects panes and drop it into the Pinned Objects pane.
-
You can drag the object from the Object Navigation pane and drop it into the Pinned Objects pane.
-
You can right-click on an object and look for the “Pin” selection. This will explicitly pin the object.
The figure below depicts the Objects Folder that was added to the Pinned Objects pane. Pinning Folders or Plans can be very useful because you can then expand the container to access the nested objects. To unpin an object, simply click on the Pin icon to the right of the object.

To find a specific object within Map View, we’ve provided a built-in search capability. There are two (2) methods for accessing search. Either click on the Search icon (magnifying glass image) in the Map View toolbar or press the Ctrl space hotkey and the search bar will appear. You may click on the “x” to the right of the Search bar (or press the Escape key) when text is present to clear that text. To remove the Search bar (with no text present), press the Escape key.
The Search Bar allows you to enter a partial name or label of an object. As you enter the data, the search will, in realtime, display matching possibilities. Double-clicking on an entry in the search list will result in the system selecting the object in the Map View canvas area.

Map View allows you to traverse previous views (zoom, pan, expand, collapse) through the use of the left and right arrow buttons found on the Map View Tool Bar. This can be very handy when you’ve needed to search for something and then return to the same view you were originally working on.

This section describes how you can create Completion Triggers using the Map View.

While adding new objects using the Object Navigation pane is popular, adding new objects is also supported in the Map View. To create a new workflow (where workflow is a term that typically implies a Plan with one or more Jobs) or to add objects to an existing workflow, right click in the white space of the canvas area and select New… and then Folder, Plan or Job. Note: If you are adding a new object to an existing Folder or Plan, right in the white-space area of the desired Folder or Plan. When creating a new object, its property sheets are tabbed the Main view. You may create any ActiveBatch object you like, however, only Folders, Plans, Jobs and Reference Objects are visually displayed in Map View canvas area. The other objects can be seen in the Child Objects pane (and of course in the Object Navigation tree).
For the purposes of this section, let’s assume we have a Plan named Serial_Jobs with three Jobs named TestJob1 through TestJob3. Each Job is to be executed sequentially. In this example, let’s illustrate the steps necessary to add TestJob4 to the mix. The above figure shows what the display currently looks like. Right-clicking in the white space area within the existing Plan brings up a menu which allows us to create a new Job within the Serial_Jobs Plan. Assume a new Job (TestJob4) is created and saved. TestJob4 appears in the lower right portion of the Plan, but a relationship has not been established yet, as per the image below.
Adding a Completion Trigger
To create a completion trigger between TestJob3 and TestJob4, click on TestJob3's object type icon (in this example, the script icon) and hold the mouse dragging the purple box to the desired target object (TestJob4). In the figure below, the arrow is being drawn from TestJob3 to TestJob4.
When the mouse is released, the “Add Completion Trigger/Constraint” dialog appears, as depicted below. This dialog is used to create Completion Triggers, Constraints and Alert Triggers. ActiveBatch needs to know what type of relationship is being created. In our example, we are creating a Completion Trigger, which means that when TestJob3 completes successfully, TestJob4 should trigger. By default, the system assumes you are creating a Completion Trigger. Notice the "Trigger" option is auto-selected by default, and so is the Trigger's "Success" option. The fields you see outlined below are relevant to the creation of a Completion Trigger.
As per the above dialog, you can select the condition of the completion trigger. This means you can specify that the Job's completion status of success (default), failure, specific exit code(s) or aborted determine whether to trigger the next object (Job or Plan). In other words, what status should TestJob3 end with, in order to trigger TestJob4? In our example, TestJob3 must complete as a success in order for TestJob4 to be triggered. Since this is a common scenario (Completion Trigger / Success), you can bypass the above dialog and apply the defaults by pressing the Ctrl key first, then dragging and dropping as described above. Please note that if you use this feature, you will need to "check in" the changes (meaning the completion trigger(s) won't be saved until they are checked in). The Check In operation is a right-click menu option. For more details see Object Check Out and Check In
Assuming the default Success condition is selected, the relationship is shown as a green (success) arrow pointing to TestJob4. This means that when TestJob3 completes successfully, TestJob4 should begin execution. Notice that TestJob1, 2 and 3 previously ran, and their last run was a success. This is denoted by the green accent stripe to the left of the Job's icon. TestJob4 is newly created and has not run yet, therefore no accent stripe is present.
As a final note, you can see the property that was updated on the Job that you added the Completion Trigger for. In the above example, the Completion Trigger was added to TestJob3. If you look at the properties of TestJob3, you will see what was added as a result of your actions in the Map view (see the image below).You can also add, edit or remove a Completion Trigger from the Job's Completion property sheet, or by using the Map view.

This section describes how you can create constraints using the Map View. There are a few types of ActiveBatch Constraints. The one you can configure using the Map View is a Job/Plan (Instance) Constraint. A Job/Plan constraint is not a trigger. It is a way to prevent a Job that has been triggered from running until other Job/Plan instance(s) complete. You may be thinking that the Completion Trigger feature solves that use case, but sometimes workflows can be a little more complex than the sequential triggering of Jobs.
Adding a Constraint
First, let's look at the basics when creating a Job/Plan constraint using the Map View. Assume TestJob2 must wait for TestJob1 to complete successfully before it can run. To create a constraint, click on the icon representing TestJob2, then move your mouse in the direction of TestJob1 (see the image below). Release the mouse. After doing so, the Add Completion Trigger/Constraint dialog will pop up.
This dialog is used to configure Completion Triggers, Alert Triggers and Constraints. Since we are configuring a Constraint, the default "Trigger" option in the first dropdown field must be changed to Constraint (which has been done in the image below). The remaining properties are all related to Job/Plan constraints. Every Constraint must have a label. If left blank, the system will auto-assign a unique label. The remaining fields are discussed in detail in the Instance Constraint section of the documentation. If you accept the default values (depicted below) for the "Type" and Instance" fields, TestJob2's constraint will wait for the successful completion of TestJob1 before it can run.
A Constraint is depicted with a dashed line, as per the image below.
You can see the property that was updated on the Job that you added the Constraint to. In the above example, the Constraint was added on TestJob2, to wait for TestJob1's successful completion before it can run. If you look at the properties of TestJob2, you will see what was added as a result of your actions in the Map view. See the image below. You can also add, edit or remove a Constraint from the Job's Constraints property sheet, or by using the Map view. Please note that the other properties associated with this constraint that are depicted in the image below (e.g. Constraint Logic, and If constraint log fails, etc.) are discussed in the Constraints section of the documentation.
The Constraint example above depicts how to create a Job constraint using the Map View. When it comes to configuring a sequential workflow, using completion triggers to trigger one Job after another will work just fine; no Job/Plan constraints are needed. Whether to use only completion triggers or constraints - or a mix of both - will depend on the workflow.
Let's look at a different example.
-
Assume there are 4 Jobs in a Plan, and the Plan is what is triggered.
-
The first 3 Jobs can run in parallel, but the 4th Job must wait for the first 3 Jobs to complete successfully before it can run.
-
To accomplish this, add 3 Job constraints to the 4th Job, using the method described above. When configured this way, all 4 Jobs will instantiate (an instance will be created) when the Plan triggers, but only three Jobs will go into an executing state right away, since they can run in parallel. The 4th Job will go into a "waiting constraint" state. This design will work fine.
-
However, if you would rather the 4th Job not instantiate immediately when the Plan triggers (it will be in a "not run" state initially and will not be assigned an instance ID), then:
-
Keep the above described constraints, but new to the mix is the addition of completion trigger - set on one of the 3 Jobs that run in parallel - to trigger the 4th Job. When the 4th Job triggers, that is when the instance will be created.
-
Add the completion trigger to the Job that historically runs the longest out of the 3 that run in parallel. This way, it is more likely that the other two Jobs will already have completed by the time the completion trigger occurs, resulting in no wait time for the 4th Job before it starts executing (since the constraints for all three Jobs will be satisfied by the time the 4th Job triggers). This is best practice suggestion, but is not a requirement.
-
-
Adding a completion trigger in this scenario is not necessary, but it will reduce the amount of constraint logic rechecks the Scheduler has to perform when a Job is waiting on a Job/Plan constraint.
-
See the image below. Again, the completion trigger from TestJob2 to TestJob4 is optional for this use case, but it does prevent TestJob4 from instantiating until TestJob2 triggers it.
-
The image below depicts what you will see in the Instances pane if the completion trigger is not added on TestJob2. When the Plan is triggered, all Jobs are assigned an Instance ID, and TestJob4 is in a Waiting Constraint state.
The image below depicts what you will see in the Instances pane if the completion trigger is added on TestJob2. When the Plan is triggered, Jobs 1,2 and 3 are assigned an Instance ID. TestJob4 is not assigned an Instance ID, by design. When it is triggered by TestJob2, it will be assigned an Instance ID. The system will then check if the other two constraint Jobs (TestJob1 and TestJob3) are complete. If so, TestJob4 will be ready to execute right away. If not, it will go into a waiting constraint state (like what you see above).

In the previous sections we created a Job and discussed the addition of Completion Triggers and Constraints. This section describes how to manage the relationships.
To modify or delete a Completion Trigger or Constraint, right-click on the desired dashed or solid line, then select edit or remove.
A menu appears allowing you to Edit the trigger or constraint, or Remove it.

The previous sections of this chapter discussed the various pane and canvas areas that make up Map View. We’ve also looked at those operations that create and maintain object relationships. This section will discuss Map View operations themselves and how you can make the most of the Map View graphical interface.
General
When selecting objects for any of the operations below, you have a great deal of flexibility as to where to select the object. You can drag an object from the Object Navigation pane, any of the Map view panes as well as the canvas area.
Moving Objects on the Canvas Area
To move an object around on the canvas, simply select the object and left-click on the object’s name while moving the object to a new spot on the canvas. When you drop the item and then click off of it, the object will be moved and a re-layout will occur. Note that this type of move does not change the object’s path. In other words, you aren’t moving the object from one container to another.
Moving Objects
To move an object from one container object to another, you need to hold down the Shift key and then select the object on the object’s name. When you move and drop the object on another container, the object will move from one container to container. This action will result in the object’s path changing.
Copying Objects
To copy an object and drop the copy into a container, hold down the Ctrl key and then select the object on the object’s name. Now when you move and drop the object on another container, a copy of the object will be created at that container.

This section discusses what you can expect to see when you right click on an object or instance in the Map View. By right-clicking on the selected object icon, depicted in the image below, you can perform various operations. These are the same operations you would see when right-clicking on an object in the Object Navigation pane.
Map View – Instance Operations (Completed)
If you right click on the “Instance Icon” (as opposed to the object icon) you’re presented with a menu of operations appropriate for the state of the instance. For more details about instance actions you can perform - see Instance Operations
The menu below is appropriate for a completed instance.
Map View – Instance Operations (Active)
If the instance is active, the menu displayed becomes appropriate to that of an active instance. If you look closely at the image below, you will see that the Instance Icon (blue bar) becomes larger when the instance is active.

Optimize, which is short for Optimize Workflow, allows you to make changes to your workflow and determine whether the changes you make positively or negatively impact the time it takes for the workflow to complete.
Consider the sequential example we discussed earlier in the Completion Trigger section. Four Jobs trigger sequentially, one after another.
Clicking the stylized X outlined in the image above results in the Map View entering Optimize mode for that workflow (in this example, the workflow configured is the Serial_Jobs Plan).
Optimize first calculates the Critical Path (CP) for the workflow. The CP is shown with boxes around those objects that are part of the critical path. The CP is the longest path to completion. As per the above the image, all Jobs are outlined and therefore they are all part of the critical path.
Next, the average run-time is displayed for each object. The average run-time is the execution time of the object. This does not include the wait time (e.g. waiting queue busy, etc.).
The total time for the workflow is displayed to the right of “Cal” in the above image. In this example, the total calculated time for the Plan to run to completion is 10 minutes.
When in Optimize mode, the Optimize icon is replaced with 2 other icons: Commit (check in) and Undo. Any changes you make to this workflow is temporary until you commit your changes. This allows you to play around with the Jobs and other aspects of the workflow without the changes actually taking effect. The way this is implemented is through an explicit checkout of the objects - as you change them. Commit essentially becomes a type of check-in. Undo is essentially an Undo Pending Changes.
As a example of making a change when in Optimize mode, assume the completion trigger from TestJob1 to TestJob2 is removed. What you will see is depicted in the image below. First, there is a green check mark next to TestJob1, because that is the Job where the completion trigger was removed. To check in (commit) the change, click on the green check icon to the right of the down arrow at the top of the image. Next, this change results in TestJob1 no longer being part of the critical path. Next, the number of minutes the Plan will take to run (should this change be committed) is estimated to drop by one minute, hence Cal is now 9 instead of 10. There is green down arrow which means the runtime will be reduced if this change is committed. This is because TestJob1 will run in parallel with TestJob2, so that saves a minute (since TestJob1's current average run time is 1 minute, and TestJob2 no longer has to wait for it to complete before it runs). To cancel this change, you can click on the undo arrow icon to the right of the check in (commit) icon. Of course, any changes you make to the order in which Jobs run has to make sense for the Plan in question.
Next, invoking Optimize causes two (2) panes to appear under the canvas area: Object Data and Optimize Filters (outlined in red below). Object Data displays the selected object’s performance metrics. In this example, the selected object is TestJob1. This provides greater insight into how long the object has been waiting and executing. Next, Optimize Filters highlights those objects (if any) that meet the filter criteria. The “criteria” portion is a dropdown that allows you to filter based on a performance metric and a value.
The Optimize filter options are depicted in the image below. You can add or remove the filters by clicking on the green plus icon or the red stylized x icon, respectively. The filters can be helpful if you are attempting to resolve any bottlenecks that may be slowing the overall execution down. You can quickly see which Jobs meet your filter criteria, then further examine how they are configured.
For example, if you wish to see all the Jobs that have an Average Waiting Queue Busy Time greater than thirty seconds, then set the filter accordingly, then click the Apply button. In the example below, TestJob3 is highlighted. This Job meets the filter criteria.